package wenjun.du.androidart.view

import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.MotionEvent
import android.widget.RelativeLayout
import kotlin.math.abs

/**
 * 自定义父控件 重写事件拦截相关方法
 *
 * */
class ExOutRelativeLayout(
    context: Context,
    attrs: AttributeSet?,
    defStyleAttr: Int,
    defStyleRes: Int
) :
    RelativeLayout(context, attrs, defStyleAttr, defStyleRes) {

    companion object {
        private const val TAG = "ExRelative_ExOutButton"
    }

    /**
     * 次构造方法必须调用主构造方法
     *
     * */
    constructor(context: Context) : this(context, null)

    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)

    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : this(
        context,
        attrs,
        defStyleAttr,
        0
    )

    /**
     * 根据条件判断是否拦截传递的touch事件
     *
     * 1.模拟外部拦截法 在手指上下滑动的时候 父控件拦截事件，在左右滑动的时候，子控件拦截事件
     *
     * DOWN:必须返回false 否者子控件都无法收到touch事件了
     * MOVE:根据条件判断是否拦截事件
     * UP:必须返回false,否者有可能导致子控件的click事件无法响应
     *
     * */
    private var rawX: Float = 0f
    private var rawY: Float = 0f
    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {

        when (ev?.action) {
            MotionEvent.ACTION_DOWN -> {
                rawX = ev.rawX
                rawY = ev.rawY
                return false
            }
            MotionEvent.ACTION_MOVE -> {
                //判断 如果是左右滑动 则返回true 否则返回false
                val moveX = ev.rawX
                val moveY = ev.rawY
//                Log.d(TAG, "parent value rawX :$rawX moveX: $moveX  rawY :$rawY moveY : $moveY")
                Log.d(
                    TAG,
                    "parent onInterceptTouchEvent: move return result ${
                        abs(moveX - rawX) >= abs(
                            moveY - rawY
                        )
                    }"
                )
                return abs(moveX - rawX) >= abs(moveY - rawY)
            }
            MotionEvent.ACTION_UP -> return false
        }

        return super.onInterceptTouchEvent(ev)
    }

    @SuppressLint("ClickableViewAccessibility")
    override fun onTouchEvent(event: MotionEvent?): Boolean {
        Log.d(
            TAG,
            "parent onTouchEvent() called with: event = ${ViewUtil.getStringAction(event?.action)}"
        )
        return super.onTouchEvent(event)
    }
}